home *** CD-ROM | disk | FTP | other *** search
- ; Resident program to provide flicker-free write_tty scroll for Color
-
- ; Graphics Adapter clones with dual-ported memory. M. Abrash 5/3/86.
-
- ; Make runnable with MASM-LINK-EXE2BIN.
-
- cseg segment
-
- assume cs:cseg
-
- org 100h ;necessary for COM file
-
- start proc near
-
- jmp makeres
-
- old_int10 dd ?
-
- ; front end routine for BIOS video handler to scroll without flicker
-
- scroll_front_end:
-
- cmp ax,0e0ah ;only intercept write_tty function
-
- jnz pass_to_bios ; called with linefeed
-
- push ax
-
- push bx
-
- mov ah,0fh
-
- int 10h ;get current page & mode
-
- cmp al,2
-
- jz check_row ;BIOS only blanks in modes 2 & 3, so
-
- cmp al,3 ; only intercept linefeed scroll in
-
- jnz pass_to_bios2 ; modes 2 & 3
-
- check_row: ;see if cursor is on bottom row, in
-
- push cx ; which case linefeed causes scroll
-
- push dx
-
- mov ah,3
-
- int 10h ;get cursor location in current page
-
- cmp dh,24
-
- jnz pass_to_bios3 ;cursor not on bottom row, no scroll
-
- push ds ;meets all the criteria, so perform
-
- push es ; scroll in current page with special
-
- push si ; routine that doesn't disable video
-
- push di
-
- mov ah,0fh
-
- int 10h ;get # columns & page
-
- mov al,ah
-
- sub ah,ah ;convert to word
-
- push ax ;set aside # columns
-
- mov si,ax
-
- shl si,1 ;move from second row (each character=2 bytes)
-
- mov ah,24
-
- mul ah ;# words to move (24 rows)
-
- mov cx,ax
-
- sub ax,ax ;now adjust offsets for current page
-
- mov ds,ax ;buffer length is stored in BIOS segment
-
- mov al,bh ;get current page
-
- mul word ptr ds:[44ch] ;offset of start of current page
-
- add si,ax ;move data from second row of current page
-
- mov di,ax ; to top of current page
-
- mov ax,0b800h
-
- mov ds,ax
-
- mov es,ax ;will move data in display segment
-
- cld
-
- rep movsw ;scroll screen up
-
- mov ah,8 ;BH already has current page
-
- int 10h ;get attribute of character at cursor
-
- mov al,' ' ;fill with blanks & attribute just obtained
-
- pop cx ;# of words per row
-
- rep stosw ;blank bottom row-DI points to bottom row
-
- pop di ;done
-
- pop si
-
- pop es
-
- pop ds
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- iret
-
- pass_to_bios3:
-
- pop dx
-
- pop cx
-
- pass_to_bios2:
-
- pop bx
-
- pop ax
-
- pass_to_bios: ;pass interrupt to normal BIOS handler
-
- jmp cs:[old_int10]
-
- endres:
-
- ; make scroll front end handler resident & revector interrupt 10 to it
-
- makeres:
-
- push cs
-
- pop ds
-
- assume ds:cseg
-
- mov ax,3510h ;DOS get vector function, vector 10h
-
- int 21h ;get vector 10h
-
- mov word ptr [old_int10],bx ;set aside old vector to
-
- mov word ptr [old_int10+2],es ; allow pass to BIOS
-
- mov ax,2510h ;DOS set vector function, vector 10h
-
- mov dx,offset scroll_front_end ;revector interrupt
-
- int 21h ; 10h to front end routine
-
- mov dx,offset endres ;# of paragraphs to make
-
- mov cl,4 ; resident-can't do with an
-
- shr dx,cl ; expression because assembler can't
-
- inc dx ; calculate w/relocatable label
-
- mov ax,3100h ;DOS make resident fn, exit code=0
-
- int 21h ;terminate & stay resident
-
- start endp
-
- cseg ends
-
- end start
-
-
-